﻿using System.Text;

namespace WpfGenetic.Fitness
{
    /// <summary>
    /// Класс, объединяющий операции для вычисления индекса совпадений
    /// </summary>
    public static class IndexOfMatches
    {
        /// <summary>
        /// Принимает текст и заполняет словарь буква - сколько раз она встретилась, считает количество учитываемых символов
        /// </summary>
        /// <param name="text"></param>
        /// <param name="frequency"></param>
        /// <param name="realLength"></param>
        public static void FindFrequency(string text, string alphabet, out Dictionary<char, int> frequency, out int realLength)
        {
            frequency = new Dictionary<char, int>();
            realLength = 0;

            if (alphabet.Length == 0) throw new ArgumentException("Алфавит не может быть пустым"); 

            // Считаем частотность символов
            foreach (char ch in text)
            {
                if (alphabet.Contains(ch))
                {
                    frequency.TryAdd(ch, 0);
                    
                    frequency[ch]++;
                    
                    realLength++;
                }
            }
        }

        /// <summary>
        /// Принимает частотность символов и длину текста и заполняет индекс совпадений
        /// </summary>
        /// <param name="frequency"></param>
        /// <param name="length"></param>
        /// <param name="index"></param>
        public static void FindIndex(Dictionary<char, int>? frequency, int length, out double index)
        {
            index = 0;

            if (frequency is null || frequency.Count == 0) throw new ArgumentException("Частотность отсутствует");

            double bufFrequency = 0;

            foreach (int value  in frequency.Values)
            {
                bufFrequency += value * (value - 1);
            }

            double n = (double)length;

            index = bufFrequency / (n * (n - 1));
        }
    }
}
